package com.stx.test.polymorphism;

/**
 * packageName com.stx.test
 *
 * @author YangYi
 * @className AnimalDemo
 * @date 2025/9/16
 * @description TODO
 */
public class AnimalDemo {
    public static void main(String[] args) {
        // 3. 向上转型：父类引用指向子类对象 (核心步骤)
        Animal myAnimal1 = new Duck(); // Animal引用指向Duck对象
        Animal myAnimal2 = new Cat(); // Animal引用指向Cat对象

        // 多态的魅力所在：
        // 编译时看左边(Animal)，运行时看右边(Dog/Cat)
        myAnimal1.makeSound(); // 输出：嘎嘎嘎！
        myAnimal2.makeSound(); // 输出：喵喵喵！

        // 编译错误：Animal引用看不到子类特有的方法
        // myAnimal1.fetch();

        // 如果想调用Dog特有的fetch方法，需要向下转型
        if (myAnimal1 instanceof Duck) {
            Duck myDuck = (Duck) myAnimal1; // 向下转型
            myDuck.fetch(); // 输出：鸭子下水了。
        }
    }
}
